package com.example.shop_2304.fg

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.ToastUtils
import com.example.base.entity.Car
import com.example.base.entity.Goods
import com.example.base.mvvm.BaseFragment
import com.example.base.param.OrderDetail
import com.example.base.param.PPreOrder
import com.example.shop_2304.R
import com.example.shop_2304.adapter.CarAdapter
import com.example.shop_2304.databinding.FragmentCarBinding


class CarFragment : BaseFragment<FragmentCarBinding,CarViewModel>() {
    lateinit var carAdapter: CarAdapter
    override fun initView() {
       carAdapter = CarAdapter()
        binding.rv.adapter = carAdapter
        binding.rv.layoutManager = LinearLayoutManager(context)
        //请求购物车列表
        viewModel.car("true","10","1")
        //给子控件添加点击事件
        carAdapter.addChildClickViewIds(R.id.car_cb,R.id.car_add,R.id.car_sub)
        carAdapter.setOnItemChildClickListener { adapter, view, position ->
            when(view.id){
                R.id.car_cb->{
                    //点击了复选框  页面上的状态发生了变化   adapter.data也要发生变化  不需要调用这个接口（后台没有这个字段）
                    carAdapter.data[position].isCheck = !carAdapter.data[position].isCheck
                    //carAdapter.data[position].isCheck = (carAdapter.getViewByPosition(position,R.id.car_cb) as CheckBox).isChecked
                }
                R.id.car_add->{
                    // 点击了+，  页面上数据要++ ，adapter.data也要发生变化  需要调用接口（数据需要更新）
                    carAdapter.data[position].cartNum++
                    (carAdapter.getViewByPosition(position,R.id.car_num) as TextView).text = carAdapter.data[position].cartNum.toString()
                    viewModel.updateCar(carAdapter.data[position].id,carAdapter.data[position].cartNum)
                }
                R.id.car_sub->{
                    if(carAdapter.data[position].cartNum==1){
                        //ToastUtils.showLong("数量至少为1，不能再删除了")//弹出提示框，点击确定，删除购车数据
                        AlertDialog.Builder(requireContext())
                            .setTitle("提示")
                            .setMessage("确定删除【${carAdapter.data[position].storeName}】吗")
                            .setNegativeButton("我再想想"){a,b->}
                            .setPositiveButton("确定"){a,b->
                                //后台删除掉
                                viewModel.deleteCar(arrayOf(carAdapter.data[position].id))
                                //页面移除
                                carAdapter.data.removeAt(position)
                                carAdapter.notifyItemRemoved(position)
                                checkBottom()
                            }
                            .show()
                    }else{
                        carAdapter.data[position].cartNum--
                        (carAdapter.getViewByPosition(position,R.id.car_num) as TextView).text = carAdapter.data[position].cartNum.toString()
                        viewModel.updateCar(carAdapter.data[position].id,carAdapter.data[position].cartNum)
                    }
                }
            }
            //无论点击哪个，都可能会影响底部的金额和全选的状态
            checkBottom()
        }

        //点击全选cb,上方itemd选中状态发生变化
        binding.cb.setOnClickListener {
            carAdapter.data.forEach {
                it.isCheck = binding.cb.isChecked
            }
            carAdapter.notifyDataSetChanged()
            checkBottom()//底部金额也会发生变化
        }
        //点击管理，文字变成取消，底部布局变成 收藏和删除  再次点击  文字变回管理，底部布局变回金额 和立即下单
        binding.tvManage.setOnClickListener {
            if(binding.tvManage.text.toString().equals("管理")){
                binding.tvManage.text = "取消"
                binding.llCancel.isVisible = true
                binding.llManage.isVisible = false
            }else{
                binding.tvManage.text = "管理"
                binding.llCancel.isVisible = false
                binding.llManage.isVisible = true
            }
        }
        binding.tvDelete.setOnClickListener {
            //先检查是否有选中
            var flag = false//没有选中的
            carAdapter.data.forEach {
                if(it.isCheck){
                    flag = true
                }
            }
            if(flag){
                //有选中的
                //删除接口  id    //删除页面 删除实体类 postion
                var ids = arrayOf<Int>()//用来接收删除接口的id 们
                var cars = mutableListOf<Car>()//用来节后删除页面的 car 们
                carAdapter.data.forEach {
                    if(it.isCheck){
                        ids+=it.id
                        cars.add(it)
                    }
                }
                //批量删除
                viewModel.deleteCar(ids)
                //页面删除
                carAdapter.data.removeAll(cars)
                carAdapter.notifyDataSetChanged()
                //也需要更新底部的值  但是 会存在一个问题  当购物车中全部清空时，全选会选中
                checkBottom()

               
            }else{
                ToastUtils.showLong("请至少选择一个商品")
            }
        }
        //点击立即下单，调用预下单接口，并跳转到展示预下单的界面
        binding.tvBuynow.setOnClickListener {
            //判断是否有选中的
            var flag = false
            carAdapter.data.forEach {
                if(it.isCheck){
                    flag = true//有选中的
                }
            }
            if(flag){
                var pPreOrder = PPreOrder()
                //选择正确的预下单方式
                pPreOrder.preOrderType = "shoppingCart"
                //添加对应的商品的购物车id  因为是一个list集合，所以创建了一个list集合
                var list = mutableListOf<OrderDetail>()  //存入的是购物车中被选中的id
                carAdapter.data.forEach {
                    if(it.isCheck){
                        var orderDetail = OrderDetail()
                        orderDetail.shoppingCartId = it.id

                        list.add(orderDetail)
                    }
                }
                //将循环好的商品明细 添加到 参数中
                pPreOrder.orderDetails = list

                viewModel.preOrder(pPreOrder)
            }else{
                ToastUtils.showLong("请至少选择一个商品")
            }
        }
    }

    private fun checkBottom() {
        //计算合计金额  选中的单价*数量之和
        var amount = 0f
        var num = 0//选中数量
        carAdapter.data.forEach {
            if(it.isCheck){//选中了
                amount+= it.cartNum * it.price.toFloat()
                num++
            }
        }
        binding.tvTotal.text = "合计:￥$amount"
        binding.cb.text = "全选($num)"
        if(num==0){
           binding.cb.isChecked = false
        }else{
            binding.cb.isChecked = num==carAdapter.data.size
        }
        binding.tvCount.text = "购物车数量(${carAdapter.data.size})"
       /* if(num==carAdapter.data.size){
            binding.cb.isChecked = true
        }else{
            binding.cb.isChecked = false
        }*/

    }

    override fun initData() {
        viewModel.carSuccess.observe(this){
            if(it.code==200){
                carAdapter.data.clear()
                carAdapter.data.addAll(it.data.list)
                carAdapter.notifyDataSetChanged()
                binding.tvCount.text = "购物车数量(${it.data.list.size})"
            }else{
                ToastUtils.showLong(it.message)
            }
        }
        viewModel.updateSuccess.observe(this){
            ToastUtils.showLong(it.message)
        }
        viewModel.deleteSuccess.observe(this){
            ToastUtils.showLong(it.message)
        }
        viewModel.preSuccess.observe(this){
            if(it.code==200){
                ARouter.getInstance().build("/app/GetPreActivity").withString("preOrderNo",it.data.preOrderNo).navigation()
            }else{
                ToastUtils.showLong(it.message)
            }
        }
    }

    override fun getLayout(): Int  = R.layout.fragment_car

    override fun getViewModel(): Class<CarViewModel>  = CarViewModel::class.java

}